{
  "name": "chatbot_whatsapp_optimized",
  "nodes": [
    {
      "parameters": {
        "jsCode": "// Ambil output dari AI Agent\nconst agentOutput = $input.first().json.output || $input.first().json.text;\n\n// Cek apakah ada output. Jika tidak, berhenti.\nif (!agentOutput) {\n  return [];\n}\n\n// 1. Bersihkan teks (Markdown)\nconst cleanedText = agentOutput.replace(/\\*\\*/g, '');\n\n// 2. AMBIL NOMOR HP via $node\nconst phoneNumber = $node[\"WhatsApp Trigger\"]?.json?.messages?.[0]?.from || 'unknown';\n\n// 3. Hitung counter dari Simple Memory (untuk decide kirim menu atau tidak)\nconst memoryData = $input.first().json.memory || {};\nconst messageCount = memoryData.histories?.length || 0;\n\n// 4. Potong teks (Chunking) - BATASI 2800 char agar menu muat\nconst longText = cleanedText;\nconst limit = 2800;\nconst chunks = [];\n\nfor (let i = 0; i < longText.length; i += limit) {\n  chunks.push(longText.substring(i, i + limit));\n}\n\n// 5. Menu teks - SINGKAT ~150 chars\nconst menuText = \"─────────────────────\\n1️⃣ PMK  2️⃣ LSD  3️⃣ Rabies\\n4️⃣ Vaksinasi  5️⃣ PHMS  6️⃣ RPH\\n7️⃣ Lainnya - ketik nomor/pertanyaan\";\n\n// 6. Outputkan\nconst items = [];\n\nchunks.forEach((chunk) => {\n  items.push({\n    json: {\n      text_chunk: chunk,\n      phone_number: phoneNumber\n    }\n  });\n});\n\n// Kirim menu setiap 3 turn (count 0, 3, 6, dst)\nconst showMenu = (messageCount % 3 === 0);\n\nif (showMenu) {\n  items.push({\n    json: {\n      text_chunk: menuText,\n      phone_number: phoneNumber\n    }\n  });\n}\n\nreturn items;"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [-2960, -496],
      "id": "b466aeae-f61c-442a-ae8e-7a65317aa49e",
      "name": "Code - Chunk & Menu"
    },
    {
      "parameters": {
        "authentication": "serviceAccount",
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "1x0pAx5uqI-ttgr9x3qk8gah_72oudcINyr2S_ffPxUQ",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Sheet1",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Waktu ": "={{ $now.setZone('Asia/Makassar').toFormat('yyyy-MM-dd HH:mm:ss') }}",
            "Nomor Pengirim": "={{ $('WhatsApp Trigger').item.json.messages[0].from }}",
            "Nama Pengirim": "={{ $('WhatsApp Trigger').item.json.contacts[0].profile.name }}",
            "pertanyaan": "={{ $('WhatsApp Trigger').item.json.messages[0].text.body }}",
            "Jawaban AI": "={{ \"'\" + $('AI Agent').item.json.output }}"
          },
          "matchingColumns": [],
          "schema": [
            {"id": "Waktu ", "displayName": "Waktu ", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true, "removed": false},
            {"id": "Nomor Pengirim", "displayName": "Nomor Pengirim", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true, "removed": false},
            {"id": "Nama Pengirim", "displayName": "Nama Pengirim", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true, "removed": false},
            {"id": "pertanyaan", "displayName": "pertanyaan", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true, "removed": false},
            {"id": "Jawaban AI", "displayName": "Jawaban AI", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true, "removed": false}
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [-2944, -272],
      "id": "bdca8148-a413-4d9d-b023-bb2c679adffb",
      "name": "Append row in sheet"
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "={{ $('WhatsApp Trigger').item.json.messages[0].from }}",
        "contextWindowLength": 2
      },
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "typeVersion": 1.3,
      "position": [-3376, -272],
      "id": "6f21f862-aef7-4d5d-877d-c1c5ef55906d",
      "name": "Simple Memory"
    },
    {
      "parameters": {
        "updates": ["messages"],
        "options": {}
      },
      "type": "n8n-nodes-base.whatsAppTrigger",
      "typeVersion": 1,
      "position": [-3880, -496],
      "id": "722dd447-ee31-4a6a-b426-bd183d73398e",
      "name": "WhatsApp Trigger",
      "webhookId": "03090938-06df-41cb-a8f4-32424cd8d2fd"
    },
    {
      "parameters": {
        "operation": "send",
        "phoneNumberId": "787891024405208",
        "recipientPhoneNumber": "={{ $json.phone_number }}",
        "textBody": "={{ $json.text_chunk }}",
        "additionalFields": {}
      },
      "type": "n8n-nodes-base.whatsApp",
      "typeVersion": 1,
      "position": [-2720, -496],
      "id": "0ba580ea-56fb-4bbe-8b2b-ceb73b5979b1",
      "name": "Send message",
      "webhookId": "719b46a8-5f30-4807-b510-57f92579a30f",
      "credentials": {
        "whatsAppApi": {"id": "zWSbPqUqE1Re9s2y", "name": "WhatsApp account"}
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://graph.facebook.com/v20.0/787891024405208/messages",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "whatsAppApi",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"messaging_product\": \"whatsapp\",\n  \"status\": \"read\",\n  \"message_id\": \"{{ $('WhatsApp Trigger').item.json.messages[0].id }}\"\n}",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [-3680, -496],
      "id": "54e2fedf-c476-4b3e-a412-c2d7dc7f7ab5",
      "name": "Mark as Read"
    },
    {
      "parameters": {
        "authentication": "serviceAccount",
        "documentId": {
          "__rl": true,
          "value": "1GCywX8Iq4b32gfin9sylngwr5hcIgEf8ZceUF69aQ0U",
          "mode": "list",
          "cachedResultName": "kata kunci chatbot"
        },
        "sheetName": {
          "__rl": true,
          "value": 1931660499,
          "mode": "list",
          "cachedResultName": "kata_kunci"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheetsTool",
      "typeVersion": 4.7,
      "position": [-3200, -256],
      "id": "89161c42-0abb-4f74-8bd2-3a9847268208",
      "name": "Get row(s) in sheet in Google Sheets1"
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "gpt-5.2",
          "mode": "list",
          "cachedResultName": "gpt-5.2"
        },
        "builtInTools": {},
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.3,
      "position": [-3504, -288],
      "id": "d565cb00-8e13-4333-a8e7-b6a1e1f8de9f",
      "name": "OpenAI Chat Model"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $('WhatsApp Trigger').item.json.messages[0].text.body }}",
        "options": {
          "systemMessage": "ATURAN PEMAHAMAN MENU:\n- Jika pengguna mengetik ANGKA 1-7, itu adalah KODE MENU. Artinya:\n  1 = PMK (Penyakit Mulut dan Kuku)\n  2 = LSD (Lumpy Skin Disease)\n  3 = Rabies\n  4 = Vaksinasi\n  5 = Surveilans PHMS\n  6 = RPH / RPU\n  7 = Lainnya\n- Jika pengguna mengetik angka, LANGSUNG jawab topik yang sesuai DENGAN PENJELASAN LENGKAP.\n- Jangan sapa lagi jika sudah paham ini reply ke menu!\n\nWAKTU SAAT INI: {{ $now.setZone('Asia/Makassar').toFormat('HH:mm') }} WITA.\n\nINSTRUKSI SAPAAN:\n- Jika jam 04:00 - 10:00, ucapkan \"Selamat Pagi\".\n- Jika jam 10:01 - 15:00, ucapkan \"Selamat Siang\".\n- Jika jam 15:01 - 18:00, ucapkan \"Selamat Sore\".\n- Jika jam 18:01 - 03:59, ucapkan \"Selamat Malam\".\n- Selalu awali jawabanmu dengan sapaan tersebut diikuti nama penanya (jika ada), contoh: \"Selamat Siang, Pak Budi.\"\n\nKamu adalah dokter hewan virtual dari Dinas Perkebunan dan Peternakan Provinsi Kalimantan Selatan, yang bernama drh. Edi Santosa, sangat ahli dalam penyakit hewan dan peternakan.\n\nATURAN UTAMA:\n1. Untuk pertanyaan yang terlihat seperti singkatan (contoh: P2SBPTKP), istilah teknis, nama program, gunakan Google Sheets Tool.\n2. Berikan jawaban ringkas di bawah 3000 karakter.\n\nLANGKAH BERPIKIR:\n1. Baca pertanyaan.\n2. Jika ada di tool, gunakan tool.\n3. Jika tidak, jawab berdasarkan pengetahuan umum kamu.\n\nATURAN TAMBAHAN:\n1. Jika ada keluhan penyakit hewan dan mengetahui kabupaten, arahkan ke Puskeswan terdekat.\n2. Untuk pertanyaan lalulintas anjing/kucing/kera ke DKI Jakarta, Jawa Tengah, DIY, Kepulauan Riau, Bangka Belitung, Jawa Timur - dilarang karena status rabies.\n3. Untuk pemasukan Domba dari luar Kalsel - dilarang karena bisa menularkan MCF pada sapi Bali."
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3,
      "position": [-3408, -496],
      "id": "3a01759a-7390-4699-9702-bfcc5ee7d1fb",
      "name": "AI Agent"
    }
  ],
  "connections": {
    "Code - Chunk & Menu": {"main": [[{"node": "Send message", "type": "main", "index": 0}]]},
    "Append row in sheet": {"main": [[]]},
    "Simple Memory": {"ai_memory": [[{"node": "AI Agent", "type": "ai_memory", "index": 0}]]},
    "WhatsApp Trigger": {"main": [[{"node": "Mark as Read", "type": "main", "index": 0}]]},
    "Mark as Read": {"main": [[{"node": "Simple Memory", "type": "main", "index": 0}]]},
    "Get row(s) in sheet in Google Sheets1": {"ai_tool": [[{"node": "AI Agent", "type": "ai_tool", "index": 0}]]},
    "OpenAI Chat Model": {"ai_languageModel": [[{"node": "AI Agent", "type": "ai_languageModel", "index": 0}]]},
    "AI Agent": {"main": [[{"node": "Code - Chunk & Menu", "type": "main", "index": 0}, {"node": "Append row in sheet", "type": "main", "index": 0}]]}
  },
  "active": true,
  "settings": {"executionOrder": "v1"},
  "versionId": "optimized-v1",
  "id": "CWqNus7C1KX4F9ro_optimized",
  "tags": []
}
